"""
python线程间的通信，通过queue实现示例

在Python中，线程间的通信通常可以通过多种方式实现，但使用queue.Queue是一种既简单又线程安全
的方式。Queue模块中的Queue类提供了线程安全的队列实现，用于在多线程编程中传递数据。

下面是一个使用queue.Queue实现线程间通信的简单示例。在这个示例中，我们将创建一个生产者线
程，它生成数据并放入队列中，以及一个消费者线程，它从队列中取出数据并处理。

"""
import threading
import queue
import time


# 生产者函数
def producer(q):
    for i in range(5):
        item = f'项目 {i}'
        print(f'生产者 生产了 {item}')
        q.put(item)  # 将项目放入队列
        time.sleep(1)  # 模拟耗时操作


# 消费者函数
def consumer(q):
    while True:
        item = q.get()  # 从队列中获取项目
        if item is None:  # 当接收到None时，表示没有更多项目，线程结束
            break
        print(f'消费者 消费了 {item}')
        q.task_done()  # 表示之前入队的一个任务已经完成


# 主函数
def main():
    q = queue.Queue()

    # 创建并启动生产者线程
    t1 = threading.Thread(target=producer, args=(q,))
    t1.start()

    # 创建并启动消费者线程
    t2 = threading.Thread(target=consumer, args=(q,))
    t2.start()

    # 等待生产者线程完成
    t1.join()

    # 当生产者完成后，放入一个None到队列中，表示没有更多项目
    q.put(None)

    # 等待队列中的所有项目都被消费
    q.join()


if __name__ == '__main__':
    main()